package testes;

import utilitarios.*;
import org.junit.*;
import java.util.List;


public class TestesUnidade {
	private Musica musica;
	private Musica musica2;
	private Usuario usuario1;
	private Usuario usuario2;
	private Usuario usuario3;
	private Usuario usuario4;
	private Usuario usuario5;
	private Lista lista;
	private Radio radio;
		
	//cria elementos do sistema
	@Before public void criaElementos() throws Exception{
		radio = new Radio();
		musica = new Musica("Me Usa","Me Usa","Magnificos", "1997", "Forro", "/home/Musicas");
		musica2 = new Musica("Me Usa","Me Usa","Magnificos", "1997", "Forro", "/home/Musicas");
		usuario1 = new Usuario("hiagosoares12@hotmail.com", "Hiago", "12243612");
		usuario2 = new Usuario("luis143@hotmail.com", "Luis", "12345623");
		usuario3 = new Usuario("ana12luiza@hotmail.com", null, "35647584");
		usuario4 = new Usuario("andreluiz@hotmail.com", "andre", "23456423");
		usuario5 = new Usuario("hiagosoares12@hotmail.com", "Hiago", "12243612");
		lista = new Lista("listapreferida");
	}
	
	// ● Caso de uso 1: CRUD de usuários
	@Test public void Testa1() throws Exception{
		Assert.assertEquals(radio.criaUsuario(usuario1.getEmail(), usuario1.getNome(),usuario1.getSenha()),true);
		Arq.escreveArquivoUsuarios("arquivo", (List<Usuario>) usuario1);//verificar escrita de usuario1 e nao usuarios
//		Assert.assertTrue(radio.addUsuario(usuario1),true);
		Assert.assertEquals(false,radio.criaUsuario("","",""));
		Assert.assertTrue(radio.criaUsuario(usuario3.getEmail(), usuario3.getNome(), usuario3.getSenha()) == false);
		Assert.assertTrue(radio.removeUsuario("hiagosoares12@hotmail.com") == true);
		Assert.assertTrue(radio.verificaUsuario("hiagosoares12@hotmail.com") == false);
		Assert.assertTrue(radio.removeUsuario("marcos123@hotmail.com") == false);
		Assert.assertTrue(radio.criaUsuario(usuario2.getEmail(), usuario2.getNome(), usuario2.getSenha()) == true);
		Assert.assertTrue(usuario2.setSenha("12345623", "23456776") == true);
		Assert.assertTrue(radio.login("Luis", "12243612")||usuario2.comparaSenha("12243612") == false); 
		Assert.assertTrue(radio.criaUsuario(usuario2.getEmail(), usuario2.getNome(), usuario2.getSenha()) == true);
		Assert.assertTrue(radio.verificaUsuario("luis143@hotmail.com")== false);
		Assert.assertTrue(radio.buscaUsuarioNome("pedro")== false);
		 
		//falta o metodo adiciona usuario na radio
		//verificar usuario == fazer login ou verificaNovoUsuario()
		//metodo de buscar usuario
	}
	 
	//● Caso de uso 2: Autenticação
	@Test public void Testa2() throws Exception{
		Assert.assertEquals(radio.criaUsuario("andreluiz@hotmail.com", "andre", "23456423"),true);
		Assert.assertTrue(radio.login("andre", "23456423") == true);
		 
		//verificar usuario == fazer login ou verificaNovoUsuario()
		Assert.assertTrue(radio.login("pedro", "28756586")||usuario4.comparaSenha("28756586") == true);
		//metodo de autenticação para deslogado
				 
	}
	 
	 //● Caso de uso 3: Carregar e exibir repositórios de músicas
	@Test public void Testa3(){
		//preencher asserts
		Arq.leArquivoMusicas("arquivoMusicas");
		Assert.assertEquals(radio.buscaMusica(musica.getTitulo()), "Me Usa");
		Assert.assertEquals(null, radio.buscaMusica("Me Usa não"));
		Assert.assertEquals(radio.listaAlbum(musica.getAlbum()),"Me Usa");
		Assert.assertEquals(radio.listaGenero(musica.getGenero()),"Me Usa");
		Assert.assertEquals(radio.listaArtista(musica.getArtista()),"Magnificos");
		//importa arquivos
		Assert.assertEquals(radio.buscaMusica(null), null);
		Assert.assertEquals(radio.listaAlbum(null), null);
		Assert.assertEquals(radio.listaGenero(null),null);
		Assert.assertEquals(radio.listaArtista(null),null);
	}
	
	//● Caso de uso 4: CRUD de listas de reprodução
	@Test public void Testa4() throws Exception{
		Assert.assertTrue(radio.login(usuario2.getNome(), usuario2.getSenha() )== true);
		Assert.assertTrue(usuario1.criaLista(lista.getNome()) == true);
		Assert.assertTrue(lista.addMusica(musica2)== true);
		Assert.assertTrue(lista.removeMusica(musica.getTitulo())== true);
		Assert.assertTrue(radio.buscaMusica(musica.getTitulo()) == musica);
				
		Assert.assertTrue(lista.addMusica(musica2)== true);
		//falta verificar lista recuperadas
		//Usuario.buscaLista("nomedamusica");
	}
	 
	 
	//● Caso de uso 5: Reproduzir músicas ou listas
	@Test public void Testa5(){
		Assert.assertTrue(radio.login(usuario2.getNome(), usuario2.getSenha() )== true);
		Assert.assertEquals("musica reproduzida", musica2.reproduz(),  musica2.reproduz());
		//testar ordem de reprodução
	}
	 
	//● Caso de uso 6: Qualificar músicas
	@Test public void Testa6(){
		Assert.assertEquals(0, musica2.getClassificacao());
		musica2.setClassificacao(5);
		//condiçoes limites
		Assert.assertEquals(5, musica2.getClassificacao());
	}
	 
	//● Caso de uso 7: Adicionar e remover amigos
	@Test public void Testa7(){
		Assert.assertTrue(radio.login(usuario2.getNome(), usuario2.getSenha() )== true);
		//remover amigos
			 
	}
	 
	//sorted na lista
	//preferncia musical
	//mostrar amigos

}
